Skip to content

fix(cdk/overlay): guard against null document.body before popover support check#33403

Merged
crisbeto merged 1 commit into
angular:mainfrom
arturovt:fix/cdk_overlay_bodyCanBeNull
Jul 8, 2026
Merged

fix(cdk/overlay): guard against null document.body before popover support check#33403
crisbeto merged 1 commit into
angular:mainfrom
arturovt:fix/cdk_overlay_bodyCanBeNull

Conversation

@arturovt

Copy link
Copy Markdown
Contributor

The WHATWG spec allows document.body to be null when the document element is not or has no / child, which can happen during page navigation or unload cycles. Using the 'in' operator against null throws "Cannot use 'in' operator to search for 'showPopover' in null".

TypeScript types document.body as non-nullable HTMLElement so the issue is invisible at compile time but surfaces at runtime in edge cases. Creating a minimal reproduction is impractical, as the issue occurs during edge cases in page navigation/unload cycles in a large application.

Added a null check before the 'in' expression so that when document.body is unavailable, usePopover falls back to false — the same result as when the browser doesn't support the Popover API at all.

Spec: https://html.spec.whatwg.org/multipage/dom.html#dom-document-body
Related: microsoft/TypeScript#50078

…port check

The WHATWG spec allows document.body to be null when the document element
is not <html> or has no <body>/<frameset> child, which can happen during
page navigation or unload cycles. Using the 'in' operator against null
throws "Cannot use 'in' operator to search for 'showPopover' in null".

TypeScript types document.body as non-nullable HTMLElement so the issue
is invisible at compile time but surfaces at runtime in edge cases.
Creating a minimal reproduction is impractical, as the issue occurs
during edge cases in page navigation/unload cycles in a large application.

Added a null check before the 'in' expression so that when document.body
is unavailable, usePopover falls back to false — the same result as when
the browser doesn't support the Popover API at all.

Spec: https://html.spec.whatwg.org/multipage/dom.html#dom-document-body
Related: microsoft/TypeScript#50078
@crisbeto

Copy link
Copy Markdown
Member

Is this actually coming up anywhere?

@arturovt

Copy link
Copy Markdown
Contributor Author

@crisbeto yep, the stack trace leads to that part of the code (reported to Rollbar):

image

@arturovt

Copy link
Copy Markdown
Contributor Author

@crisbeto here's the similar change: #32477

@crisbeto crisbeto added action: merge The PR is ready for merge by the caretaker target: patch This PR is targeted for the next patch release labels Jul 8, 2026
@crisbeto crisbeto merged commit 67a5031 into angular:main Jul 8, 2026
32 of 35 checks passed
@crisbeto

crisbeto commented Jul 8, 2026

Copy link
Copy Markdown
Member

This PR was merged into the repository. The changes were merged into the following branches:

crisbeto pushed a commit that referenced this pull request Jul 8, 2026
…port check (#33403)

The WHATWG spec allows document.body to be null when the document element
is not <html> or has no <body>/<frameset> child, which can happen during
page navigation or unload cycles. Using the 'in' operator against null
throws "Cannot use 'in' operator to search for 'showPopover' in null".

TypeScript types document.body as non-nullable HTMLElement so the issue
is invisible at compile time but surfaces at runtime in edge cases.
Creating a minimal reproduction is impractical, as the issue occurs
during edge cases in page navigation/unload cycles in a large application.

Added a null check before the 'in' expression so that when document.body
is unavailable, usePopover falls back to false — the same result as when
the browser doesn't support the Popover API at all.

Spec: https://html.spec.whatwg.org/multipage/dom.html#dom-document-body
Related: microsoft/TypeScript#50078
(cherry picked from commit 67a5031)
@arturovt arturovt deleted the fix/cdk_overlay_bodyCanBeNull branch July 8, 2026 13:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

action: merge The PR is ready for merge by the caretaker area: cdk/overlay target: patch This PR is targeted for the next patch release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants